﻿#include "Data.h"
#include <iostream>
#include <ctime>
using namespace std;

/*
 * Function: Data
 * Summary: 构造函数，用于初始化界面数据，包括随机生成两个数，当前总得分设置为0
 * Input: void
 * Output: void
 */
Data::Data()
{
    //在堆区创建二维数组
    checkerboard=new int*[4];
    for(int i=0;i<4;++i)
    {
        checkerboard[i]=new int[4];
    }

    //初始化二维数组
    for(int i=0;i<4;++i)
    {
        for(int j=0;j<4;++j)
        {
            checkerboard[i][j]=0;
        }
    }

    score=0;
    generateNums();
}

/*
 * Function: ~Data
 * Summary: 析构函数，用于释放堆区的棋盘数据
 * Input: void
 * Output: void
 */
Data::~Data()
{
    //先释放一维数组
    for(int i=0;i<4;++i)
    {
        delete[] checkerboard[i];
    }

    //再释放指针数组
    delete[] checkerboard;
}

/*
 * Function: getArray
 * Summary: 获取成员变量checkerboard中的数据
 * Input: void
 * Output: 返回值为二维数组所对应的指针
 */
int** Data::getArray()
{
    return checkerboard;
}

/*
 * Function: generateNums
 * Summary: 产生两个随机数
 * Input: void
 * Output: 返回值为两个随机数产生是否成功的标志
 */
bool Data::generateNums()
{
    srand((unsigned)time(NULL));

    //产生第一个随机数
    int numOneRow=rand()%4;
    int numOneColumn=rand()%4;
    checkerboard[numOneRow][numOneColumn]=2;

    //产生第二个随机数
    int numTwoRow=0;
    int numTwoColumn=0;
    do{
        numTwoRow=rand()%4;
        numTwoColumn=rand()%4;
    }while((numOneRow==numTwoRow)&&(numOneColumn==numTwoColumn));
    checkerboard[numTwoRow][numTwoColumn]=2;

    return true;
}

/*
 * Function: addScore
 * Summary: 设置成员变量score的值
 * Input: newScore为单次合并的分数
 * Output: 返回值为设置是否成功的标志
 */
bool Data::addScore(int newScore)
{
    score=score+newScore;
    return true;
}

/*
 * Function: getScore
 * Summary: 获取成员变量score的值
 * Input: void
 * Output: 返回值为获取的值
 */
int Data::getScore()
{
    return score;
}

/*
 * Function: getBestScore
 * Summary: 获取成员变量bestScore的值
 * Input: void
 * Output: 返回值为获取的值
 */
int Data::getBestScore()
{
    return bestScore;
}

/*
 * Function: setBestScore
 * Summary: 设置成员变量bestScore的值
 * Input: optimalScore为传进来的最佳分数
 * Output: 返回值为设置是否成功的标志
 */
bool Data::setBestScore(int optimalScore)
{
    bestScore=optimalScore;
    return true;
}

/*
 * Function: cleanData
 * Summary: 将分数与最佳分数比较，若超过最佳分数，则更新最佳分数，然后清除数组和score中的数据
 * Input: void
 * Output: 返回值为清除是否成功的标志
 */
bool Data::cleanData()
{
    if(score>bestScore)
    {
        bestScore=score;
    }

    score=0;
    for(int i=0;i<4;++i)
    {
        for(int j=0;j<4;++j)
        {
            checkerboard[i][j]=0;
        }
    }
    return true;
}
